# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2025/9/22 18:45
# @Author  : Dell
# @File    : structured_output.py
# @Software: PyCharm
# @Desc    :结构化数据提取1、提示词模板、2、使用langchain的响应模式（response schema）3、pydantic（适合于function call）
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate,HumanMessagePromptTemplate
from langchain.output_parsers import StructuredOutputParser,ResponseSchema

llm = ChatOpenAI(model_name='qwen-plus', base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", temperature=0.5,
                 api_key="sk-7b4f290b1a3e42a1a9a1957fa44eff37")
# 我们想要的格式
response_schemas = [
    ResponseSchema(name="艺术家",description="音乐艺术家的姓名"),
    ResponseSchema(name="歌曲",description="艺术家演奏的歌曲名称")
]

# 使用正确的输出解析器
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions() # 现在这个指令会指导LLM输出JSON结构

print(f"我们想要的格式：{format_instructions}")
# # 构建提示模板
prompt = ChatPromptTemplate(
    messages=[HumanMessagePromptTemplate.from_template("根据用户的指令，提取所有艺术家和歌曲名称\n {format_instructions}\n{user_prompt}")],
    input_variables=["user_prompt"],
    partial_variables={"format_instructions":format_instructions}
)
# 创建链
chain=prompt | llm| output_parser
# 调用链并获取结构化的输出
try:
    structured_output = chain.invoke({"user_prompt": "在当代华语乐坛，周杰伦以其独特的风格创作了诸如《七里香》等经典作品"})
    print(structured_output)
    # 预期输出: {'艺术家': '周杰伦', '歌曲': '《七里香》'}

except Exception as e:
    print(f"在执行过程中发生错误: {e}")
